From 86cf63d6f45f02b9f2abd81f80db01cb9b8a5d8b Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 27 Aug 2008 14:57:23 +0100 Subject: [PATCH] ioemu: Add SEEK_STAT in all non-error cases except sleep request, since our seek times are virtually 0. Although this flag is deprecated by newer ATA standards, Linux at least checks it for CD drives, and would timeout in some cases if we do not set it. Signed-off-by: Samuel Thibault --- tools/ioemu/hw/ide.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/ioemu/hw/ide.c b/tools/ioemu/hw/ide.c index 7895af80e6..63704ef04c 100644 --- a/tools/ioemu/hw/ide.c +++ b/tools/ioemu/hw/ide.c @@ -1108,14 +1108,14 @@ static void ide_flush_cb(void *opaque, int ret) return; } else - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); } static void ide_atapi_cmd_ok(IDEState *s) { s->error = 0; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); } @@ -1229,7 +1229,7 @@ static void ide_atapi_cmd_reply_end(IDEState *s) if (s->packet_transfer_size <= 0) { /* end of transfer */ ide_transfer_stop(s); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); #ifdef DEBUG_IDE_ATAPI @@ -1307,10 +1307,10 @@ static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size) s->io_buffer_index = 0; if (s->atapi_dma) { - s->status = READY_STAT | DRQ_STAT; + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; ide_dma_start(s, ide_atapi_cmd_read_dma_cb); } else { - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_atapi_cmd_reply_end(s); } } @@ -1325,7 +1325,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors, s->io_buffer_index = sector_size; s->cd_sector_size = sector_size; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_atapi_cmd_reply_end(s); } @@ -1368,7 +1368,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) } if (s->packet_transfer_size <= 0) { - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); eot: @@ -1418,7 +1418,7 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors, s->cd_sector_size = sector_size; /* XXX: check if BUSY_STAT should be set */ - s->status = READY_STAT | DRQ_STAT | BUSY_STAT; + s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; ide_dma_start(s, ide_atapi_cmd_read_dma_cb); } @@ -1886,7 +1886,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) ide_abort_command(s); } else { s->mult_sectors = s->nsector; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; } ide_set_irq(s); break; @@ -1896,7 +1896,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) case WIN_VERIFY_ONCE: /* do sector number check ? */ ide_cmd_lba48_transform(s, lba48); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_READ_EXT: @@ -1965,12 +1965,12 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) case WIN_READ_NATIVE_MAX: ide_cmd_lba48_transform(s, lba48); ide_set_sector(s, s->nb_sectors - 1); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_CHECKPOWERMODE1: s->nsector = 0xff; /* device active or idle */ - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_SETFEATURES: @@ -2070,7 +2070,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) /* overlapping commands not supported */ if (s->feature & 0x02) goto abort_cmd; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->atapi_dma = s->feature & 1; s->nsector = 1; ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE, @@ -2289,7 +2289,7 @@ static void ide_reset(IDEState *s) s->mult_sectors = MAX_MULT_SECTORS; s->cur_drive = s; s->select = 0xa0; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_signature(s); /* init the transfer handler so that 0xffff is returned on data accesses */ -- 2.30.2